/**
 * 入口模块
 */
const express = require('express');
const bodyParser = require('body-parser');
const expressJwt = require('express-jwt');

const utils = require('./common/utils');
const uploadMid = require('./middleware/uploadMid');
const utilsMid = require('./middleware/utilsMid')

const app =express();//创建主应用

/**配置post*/
app.use(bodyParser.urlencoded({ limit: '10MB', extended: false }));//解析post请求数据
app.use(bodyParser.json({limit: '10MB'}));//数据JSON类型
/**配置post*/

//静态资源配置，即开放某些资源
app.use(express.static('static'));//static目录在url开放为'/'

// post请求处理
app.use(express.urlencoded({extended: true}));

// 设置解密token的密钥、算法、以及不需要token验证的路由
app.use(expressJwt({
  secret: 'mes_qdhd_mobile_xhykjyxgs', //token密钥
  algorithms: ['HS256'], //算法
}).unless({
  path: ['/login', '/register', '/index', '/mix/search-user', '/mix/list-goods', '/mix/list-goods_category', '/user/perfect']//除了这些路径(包括这些路径下的子路径)，其他的URL都需要进行token验证
}))

// 需要进行token验证的路由的函数
app.use(function(request, response, next) {
  let token = request.headers['authorization'] //获取token
  console.log('进行token解析,token='+token);

  /**执行next()是为了让那些不需要token验证的接口通过*/
  if(token === undefined){ //如何过token为空
    console.log('token为空');
    // response.status(401).send('token为空');
    return next(); //进行下一步,
    /**执行next()是为了让那些不需要token验证的接口通过*/

  } else {

    /**对需要进行token验证的接口进行验证,且验证成功*/
    utils.verToken(token)
      .then((data)=> {
        console.log('token验证成功')
        console.log('data=' + data); /**data中存储了username等关键信息*/
        console.log(data);
        request.tokenData = data;//把data放入request中

        // app.post('/*', [uploadMid.uploadFile] ,(request ,response ,next) => {
        //   console.log('检查是否存在上传文件完毕');
        //   next();
        // });

        return next(); //放行,
      })
      /**对需要进行token验证的接口进行验证,且验证成功*/

      /**对需要进行token验证的接口进行验证,但是验证不通过*/
      .catch((error)=>{
        console.log('token验证错误:' + error);
        let data = {
          code: 401,
          msg: 'token失效'
        }
        return response.status(401).send(data); //status = 401 , 前台回去处理response.err
      })
    /**对需要进行token验证的接口进行验证,但是验证不通过*/

  }

});


// 用户上传文件操作，所有的请求/*都会进入此中间件进行检查处理
app.post('/*', [utilsMid.uploadFile] ,(request ,response ,next) => {
  console.log('检查是否存在上传文件完毕');
  next();
});

app.use('/', require('./router/noVerRou')); // 调用无需身份的路由
app.use('/mix', require('./router/mixRou')); // 调用混合路由
app.use('/user',require('./router/userRou')); // 调用用户的路由
app.use('/admin', require('./router/adminRou')); // 调用管理员路由


//监听服务器
app.listen(3001, function(){
  console.log('PUMA is readying for action................... please to 3001 port');
  console.log();
});
